# -*- coding: utf-8 -*-
"""
项目日志系统
支持彩色输出和不同级别的日志记录
"""

import logging
import sys
import os
from logging.handlers import RotatingFileHandler

# 导入colorama支持彩色输出
try:
    import colorama
    # 初始化colorama，自动转换ANSI颜色代码
    colorama.init(autoreset=True)
    HAS_COLORAMA = True
except ImportError:
    HAS_COLORAMA = False

# 定义颜色代码
class Colors:
    if HAS_COLORAMA:
        RESET = colorama.Style.RESET_ALL
        RED = colorama.Fore.RED
        GREEN = colorama.Fore.GREEN
        YELLOW = colorama.Fore.YELLOW
        BLUE = colorama.Fore.BLUE
        MAGENTA = colorama.Fore.MAGENTA
        CYAN = colorama.Fore.CYAN
        WHITE = colorama.Fore.WHITE
    else:
        # 如果没有colorama，使用ANSI颜色代码
        RESET = "\033[0m"
        RED = "\033[31m"
        GREEN = "\033[32m"
        YELLOW = "\033[33m"
        BLUE = "\033[34m"
        MAGENTA = "\033[35m"
        CYAN = "\033[36m"
        WHITE = "\033[37m"

# 彩色日志格式化器
class ColoredFormatter(logging.Formatter):
    """彩色日志格式化器"""
    
    # 不同日志级别的颜色映射
    LEVEL_COLORS = {
        'DEBUG': Colors.CYAN,
        'INFO': Colors.GREEN,
        'WARNING': Colors.YELLOW,
        'ERROR': Colors.RED,
        'CRITICAL': Colors.MAGENTA,
    }
    
    def format(self, record):
        # 获取日志级别的颜色
        color = self.LEVEL_COLORS.get(record.levelname, Colors.WHITE)
        
        # 格式化日志记录
        log_message = super().format(record)
        
        # 添加颜色
        colored_message = f"{color}{log_message}{Colors.RESET}"
        
        return colored_message

# 创建日志记录器
def setup_logger(name='qnbt', log_file='logs/app.log', level=logging.INFO):
    """
    设置日志记录器
    
    Args:
        name: 日志记录器名称
        log_file: 日志文件路径
        level: 日志级别
        
    Returns:
        logging.Logger: 配置好的日志记录器
    """
    # 创建日志目录
    log_dir = os.path.dirname(log_file)
    if log_dir and not os.path.exists(log_dir):
        os.makedirs(log_dir)
    
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(level)
    
    # 避免重复添加处理器
    if logger.handlers:
        # 清除现有处理器以避免重复
        logger.handlers.clear()
    
    # 创建格式化器
    file_formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
    )
    
    console_formatter = ColoredFormatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )
    
    # 文件处理器（带轮转）
    file_handler = RotatingFileHandler(
        log_file, 
        maxBytes=10*1024*1024,  # 10MB
        backupCount=5
    )
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(file_formatter)
    
    # 控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(level)
    console_handler.setFormatter(console_formatter)
    
    # 添加处理器到日志记录器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    return logger

# 创建默认日志记录器
logger = setup_logger()

# 便捷函数
def debug(message):
    """调试日志"""
    logger.debug(message)

def info(message):
    """信息日志"""
    logger.info(message)

def warning(message):
    """警告日志"""
    logger.warning(message)

def error(message):
    """错误日志"""
    logger.error(message)

def critical(message):
    """严重错误日志"""
    logger.critical(message)

# 为不同模块创建专门的日志记录器的函数
def get_module_logger(module_name):
    """
    为特定模块创建日志记录器
    
    Args:
        module_name: 模块名称
        
    Returns:
        logging.Logger: 模块专用日志记录器
    """
    return setup_logger(f'qnbt.{module_name}', f'logs/{module_name}.log')